import 'package:flutter/cupertino.dart';
import 'package:flutter/foundation.dart';
import 'package:flutter_wan_android/generated/l10n.dart';
import 'package:flutter_wan_android/http/http_exception.dart';
import 'package:flutter_wan_android/init/default_app.dart';
import 'package:pull_to_refresh/pull_to_refresh.dart';

import 'view_state_model_list.dart';

/// 上拉加载/下拉刷新时使用
abstract class ViewStateRefreshListModel<T> extends ViewStateListModel<T> {
  /// 分页第一页页码
  static const int pageNumFirst = 0;

  /// 分页条目数量
  static const int pageSize = 20;

  ///刷新控制器
  RefreshController _refreshController = RefreshController(initialRefresh: false);

  RefreshController get refreshController => _refreshController;

  /// 当前页码
  int _currentPageNum = pageNumFirst;

  /// 下拉刷新
  ///
  /// [init] 是否是第一次加载
  /// true:  Error时,需要跳转页面
  /// false: Error时,不需要跳转页面,直接给出提示
  ///
  @override
  Future<List<T>> refresh({bool isBusy = false, bool init = false}) async {
    _currentPageNum = pageNumFirst;

    if (isBusy) {
      setBusy();
    }

    ///返回的数据集
    List<T> data;
    try {
      data = await loadData(pageNum: pageNumFirst);
    } catch (e, s) {
      /// 页面已经加载了数据,如果刷新报错,不应该直接跳转错误页面
      /// 而是显示之前的页面数据.给出错误提示
      if (init) {
        dataList.clear();
      }
      refreshController.refreshFailed();
      if (e is AppHttpException) {
        setError(e, s);
      } else {
        BuildContext context = navigatorKey.currentState.overlay.context;
        AppHttpException exception = AppHttpException(
          HttpErrorType.defaultError,
          message: S.of(context).requestError,
          errorMessage: S.of(context).requestError,
        );
        setError(exception, s);
      }
      return null;
    }

    if (data == null || data.isEmpty) {
      refreshController.refreshCompleted(resetFooterState: true);
      dataList.clear();
      setEmpty();
    } else {
      onCompleted(data);
      dataList.clear();
      dataList.addAll(data);
      refreshController.refreshCompleted();

      /// 小于分页的数量,禁止上拉加载更多
      if (data.length < pageSize) {
        refreshController.loadNoData();
      } else {
        ///防止上次上拉加载更多失败,需要重置状态
        refreshController.loadComplete();
      }
      setIdle();
    }
    return data;
  }

  ///
  /// 上拉加载更多
  ///
  Future<List<T>> loadMore() async {
    ///返回的数据集
    List<T> data;
    try {
      data = await loadData(pageNum: ++_currentPageNum);
    } catch (e, s) {
      --_currentPageNum;
      refreshController.loadFailed();

      /// 这里不能调用setError
      /// 调用setError会让整个页面变成错误页面
      /// 之前的数据也会被移除掉
      debugPrint('error--->\n' + e.toString());
      debugPrint('statck--->\n' + s.toString());
      return null;
    }

    if (data == null || data.isEmpty) {
      _currentPageNum--;
      refreshController.loadNoData();

      /// 这里不能调用setEmpty
      /// 调用setEmpty会让整个页面变成空数据页面
      /// 之前的数据也会被移除掉
    } else {
      onCompleted(data);
      dataList.addAll(data);

      /// 小于分页的数量,所有数据已加载完成
      /// 禁止上拉加载更多
      if (data.length < pageSize) {
        refreshController.loadNoData();
      } else {
        ///防止上次上拉加载更多失败,需要重置状态
        refreshController.loadComplete();
      }
      setIdle();
    }
    return data;
  }

  /// 加载数据
  Future<List<T>> loadData({int pageNum});

  @override
  void dispose() {
    _refreshController.dispose();
    super.dispose();
  }
}
